// 导入axios库，用于发送HTTP请求
import axios from 'axios'
// 导入路由对象，用于处理需要导航的逻辑
import router from "../router";

// 创建axios实例，并配置基础URL和请求超时时间
// 创建一个axios实例，用于处理HTTP请求
const request = axios.create({
    baseURL: 'http://localhost:8080', // 定义基础URL，所有通过该实例发出的请求都将使用这个基础URL
    timeout: 5000, // 设置请求超时时间为5000毫秒（5秒），以确保请求不会无限期等待响应
    headers: { // 定义请求头，用于每个通过该实例发出的请求
        'Content-Type': 'application/json', // 指定请求体的类型为JSON，以便服务器能够正确解析
    }
})

/**
 * 添加请求拦截器，用于在请求发送之前进行一些预处理
 * 主要用于加入Token到请求头中，以便进行身份验证
 * @param {Object} config - 请求配置对象
 * @returns {Object} 处理后的请求配置对象
 */
// 使用拦截器对请求进行预处理
request.interceptors.request.use(
    config => {
        // 从本地存储中获取用户令牌
        const token = localStorage.getItem('token');
        // 如果存在令牌，则将其添加到请求头中
        if (token) {
            config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
    },
    error => {
        // 处理请求错误
        return Promise.reject(error);
    }
);

/**
 * 添加响应拦截器，用于在响应返回之后进行一些处理
 * 主要用于处理一些公共的响应错误，例如403错误
 * @param {Object} response - 响应对象
 * @returns {Object} 处理后的响应对象
 */
request.interceptors.response.use(
    function (response) {
        // 对响应数据做点什么
        return response;
    },
    function (error) {
        // 处理响应错误
        if (error.response && error.response.status === 403) {
            // 处理403错误，通常是权限问题
            console.error('403 Forbidden Error: Access denied');
            router.push('/login')
        }
        return Promise.reject(error);
    }
);

// 导出axios实例，供其他模块使用
export default request
